/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tomasio.projects.welcome.model;

import com.tomasio.projects.welcome.dto.MovimentacaoDTO;
import com.tomasio.projects.welcome.dto.MovimentacaoPessoaDTO;
import com.tomasio.projects.welcome.dto.MovimentacaoVeiculoDTO;
import java.util.Date;

/**
 *
 * @author administrador
 */
public abstract class Movimentacao {

    private Long id;
    private TipoMovimentacao tipo;
    private Date data;

    public Movimentacao() {
    }

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public TipoMovimentacao getTipo() {
        return tipo;
    }

    public void setTipo(TipoMovimentacao tipo) {
        this.tipo = tipo;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Movimentacao other = (Movimentacao) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 11 * hash + (this.tipo != null ? this.tipo.hashCode() : 0);
        return hash;
    }

    public MovimentacaoDTO createDTO() {
        MovimentacaoDTO dto = instantiateDTO();
        dto.setData(data);
        dto.setTipo(tipo);
        dto.setId(id);
        return dto;
    }

    protected abstract MovimentacaoDTO instantiateDTO();

    public void fillAttributesFromDTO(MovimentacaoDTO dto) {
        this.id = dto.getId();
        this.data = dto.getData();
        this.tipo = dto.getTipo();

    }

    public static Movimentacao instantiate(MovimentacaoDTO dto) {
        if (dto instanceof MovimentacaoVeiculoDTO) {
            return new MovimentacaoVeiculo(
                    (MovimentacaoVeiculoDTO) dto);
        } else {
            return new MovimentacaoPessoa(
                    (MovimentacaoPessoaDTO) dto);
        }
    }
}
